package loveqq.niceexcel.read.handler.internal;

import cn.hutool.core.util.StrUtil;
import loveqq.niceexcel.annotation.ExcelBegin;
import loveqq.niceexcel.annotation.internal.Internal;
import loveqq.niceexcel.core.metadata.BeginHeadMeta;
import loveqq.niceexcel.read.ReadContext;
import loveqq.niceexcel.read.handler.CellReadHandler;
import loveqq.niceexcel.read.handler.LocateDataReadHandler;
import loveqq.niceexcel.read.handler.WorkbookReadHandler;
import loveqq.niceexcel.util.CellUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;

/**
 * @author zhongjh@tsintergy.com
 * @date 2022-08-29
 */
@Internal
public class ExcelBeginReadHandler implements WorkbookReadHandler, CellReadHandler, LocateDataReadHandler {
    private final BeginHeadMeta beginHeadMeta = new BeginHeadMeta();

    @Override
    public void onWorkbookBegin(ReadContext context, Workbook workbook) {
        ExcelBegin beginAnno = context.getHeadClass().getAnnotation(ExcelBegin.class);
        if (beginAnno != null) {
            beginHeadMeta.setRowHead(beginAnno.row());
            beginHeadMeta.setColumnHead(beginAnno.column());
            beginHeadMeta.setIncludeSelf(beginAnno.includeSelf());
        }
    }

    @Override
    public void onCellRead(ReadContext context, Cell cell) {
        if (!context.getMergedRegions().isRegionFirstCell(cell)) {
            return;
        }
        // 如果是表头名字且是合并区域的第一个单元格
        String headName = CellUtils.getCellData(context.getMergedRegions().getRegionFirstCell(cell)).getStringValue();
        if (StrUtil.isNotEmpty(headName) && headName.equals(beginHeadMeta.getRowHead())) {
            beginHeadMeta.setRowIndex(cell.getRowIndex());
            beginHeadMeta.setRowRegion(context.getMergedRegions().getRegion(cell));
        }
        if (StrUtil.isNotEmpty(headName) && headName.equals(beginHeadMeta.getColumnHead())) {
            beginHeadMeta.setColumnIndex(cell.getColumnIndex());
            beginHeadMeta.setColumnRegion(context.getMergedRegions().getRegion(cell));
        }
    }

    @Override
    public boolean beforeLocateData(ReadContext context, Cell cell) {
        // 行或列未开始
        if (isRowNotStart() || isColumnNotStart()) {
            return false;
        }
        // 列开始且要求读此列
        if (beginHeadMeta.getColumnRegion() != null && beginHeadMeta.isIncludeSelf()
                && cell.getColumnIndex() < beginHeadMeta.getColumnRegion().getFirstColumn()) {
            return false;
        }
        // 列开始且要求不读此列
        if (beginHeadMeta.getColumnRegion() != null && !beginHeadMeta.isIncludeSelf()
                && cell.getColumnIndex() <= beginHeadMeta.getColumnRegion().getLastColumn()) {
            return false;
        }
        // 行开始且要求读此行
        if (beginHeadMeta.getRowRegion() != null && beginHeadMeta.isIncludeSelf()
                && cell.getRowIndex() < beginHeadMeta.getRowRegion().getFirstRow()) {
            return false;
        }
        // 行开始且要求不读此行
        if (beginHeadMeta.getRowRegion() != null && !beginHeadMeta.isIncludeSelf()
                && cell.getRowIndex() <= beginHeadMeta.getRowRegion().getLastRow()) {
            return false;
        }
        return true;
    }

    /**
     * 行横向定位数据未开始
     */
    private boolean isRowNotStart() {
        return StrUtil.isNotEmpty(beginHeadMeta.getRowHead()) && beginHeadMeta.getRowIndex() < 0;
    }

    /**
     * 列竖向定位数据未开始
     */
    private boolean isColumnNotStart() {
        return StrUtil.isNotEmpty(beginHeadMeta.getColumnHead()) && beginHeadMeta.getColumnIndex() < 0;
    }

}
